from datetime import datetime

def calculate_refund(total_premium, start_date_str, end_date_str, amendment_effective_date_str):
    """
    计算退费金额

    参数:
    total_premium (float): 雇员总保费
    start_date_str (str): 保险起期（格式：YYYY-MM-DD HH:MM:SS）
    end_date_str (str): 保险止期（格式：YYYY-MM-DD HH:MM:SS）
    amendment_effective_date_str (str): 批改生效日期（格式：YYYY-MM-DD HH:MM:SS）

    返回:
    float: 退费金额
    """

    try:
        # 定义日期时间格式
        date_format = '%Y-%m-%d %H:%M:%S'

        # 将字符串转换为日期时间对象
        start_date = datetime.strptime(start_date_str, date_format)
        end_date = datetime.strptime(end_date_str, date_format)
        amendment_effective_date = datetime.strptime(amendment_effective_date_str, date_format)

        # 检查日期的有效性
        if not (start_date <= amendment_effective_date <= end_date):
            raise ValueError("批改生效日期必须在保险期间内")

        # 计算总保期天数和剩余未使用期间的天数
        total_days = (end_date - start_date).days + (end_date - start_date).seconds / 86400 + 1  # 包含起始日和结束日
        unused_days = (end_date - amendment_effective_date).days + (end_date - amendment_effective_date).seconds / 86400 + 1  # 包括批改生效时间和结束时间

        if unused_days <= 0:
            raise ValueError("批改生效日期应在保险止期之前")

        # 计算每日平均保费
        daily_premium = total_premium / total_days

        # 计算退费金额
        refund_amount = daily_premium * unused_days

        return round(refund_amount, 2)  # 四舍五入到小数点后两位

    except ValueError as ve:
        raise ValueError(f"日期时间格式错误或日期范围无效: {ve}")

# 示例用法
if __name__ == "__main__":
    try:
        total_premium = float(input("请输入雇员总保费: "))
        start_date_str = input("请输入保险起期 (YYYY-MM-DD HH:MM:SS): ")
        end_date_str = input("请输入保险止期 (YYYY-MM-DD HH:MM:SS): ")
        amendment_effective_date_str = input("请输入批改生效日期 (YYYY-MM-DD HH:MM:SS): ")

        refund_amount = calculate_refund(total_premium, start_date_str, end_date_str, amendment_effective_date_str)
        print(f"应退还的金额为: {refund_amount} 元")
    except Exception as e:
        print(f"发生错误: {e}")